Kubernetes概览

译者:kz 校对:无

Kubernetes是一个能在集群中跨多主机管理容器化应用的的开源系统。Kubernetes的意在让部属容器化和基于微服务的应用变得简单但是强大。

Kubernetes提供了诸多机制用来进行应用部署,调度,更新,维护和伸缩。一个Kubernetes的关键特性是能它能主动的管理容器来保证集群的状态不断地符合用户的期望状态。一个运维人员能够启动微服务,然后让调度器来找到合适的安置点。我们也想不断的改善工具和用户体验,让他们能通过如金丝雀部署等模式来放出应用。

Kubernetes支持DockerRocket容器, 对其他的容器镜像格式和容器runtime会在未来加入。

尽管Kubernetes目前集中关注持续运行的无状态(如web服务器和内存中的对象缓存)和云原生状态的的应用(如NoSQL数据库),在很快的将来,也会支持所有的其他的在生产集群环境能常见到的workload类型,例如批处理,流式处理,和传统的数据库。

Kubernetes中,所有的容器都运行在pod中,一个pod来容纳一个单独的容器,或者多个合作的容器。在后一种情况,pod中的容器被保证放置在同一个机器上,可以共享资源。一个pod也能包含零个或者更多的的volume,volume是对一个容器私有的目录或者可以在pod中的容器间共享。对于用户每个创建的pod,系统会找一个健康运转并且有足够的容量的机器,然后开始将相应的容器在那里启动。如果一个容器失败,它会被Kubernetes的node agent自动重启,这个node agent被称作Kubelet。但是如果pod或者他的机器出故障,它不会被自动转移或者重启,除非用户也定义了一个replication controller,我们马上就会讲到它。

用户可以自己创建并管理pod,但是Kubernetes极大的简化了系统管理,它能让用户指派两个常见的跟pod相关的活动:基于相同的pod配置,部署多个pod副本,和创建替换的pod当一个pod或者它所在的机器发生故障的时候。Kubernetes的API对象用来管理这些行为的被称作replication controller,它用模板的形式定义了pod,然后系统根据模板实例化出一些pod(特别是由用户)。pod的副本集合可以共同组成一整个应用,一个微服务,或者在一个多层应用的一层。一旦pod创建好,系统会持续的监控他们的健康状态,和它们运行时所在的机器的健康状况。如果一个pod因为软件问题或者所在机器故障出现问题,replication控制器会自动在健康的机器上创建一个新的pod,来保证pod的集合处于一个期望的冗余水平。一个或者多个应用的多个pod能共享一个机器。注意一个replication控制器在点那个非副本pod的的情况下也会被需要,如果用户想在pod或者其运行所在的机器出现故障的时候能重新创建。

能够方便的指代一个pod集合是一个常见需要用到的功能。例如,需要限制一个修改型操作到一个有限制的集合里,或者限制需要查询状态的pod集合范围。作为一个常见的机制,Kubernetes绝大多是的API对象都允许用户添加任意的key-value键值对,被称作label,并且可以让用户用一系列的label选择器(对label的键值对查询)来限制API操作的目标。每一个资源也有一个字符串类型的键值可以被外部的工具来存储或者获取任意的元数据,被称作annotations(备注)。

Kubernetes支持一种独特的网络模型。Kubernetes鼓励用扁平的地址空间,并且不会动态的分配端口,而是采用让用户可以选择任意合适自己的端口。为了实现这点,它给每一个pod分配了一个ip地址。

现代的Internel应用通常由层级的微服务构建而来,例如一组前端和分布式的内存内键值存储交互,和副本复制的存储服务交互。为了构建这种架构,Kubernetes提供了service的抽象,其提供了一稳定的IP地址和DNS名字,来对应一组动态的pod,例如一组构成一个微服务的pod。这个pod组是通过label选择器来定义的,因为可以指定任何的pod组。当一个运行在Kubernetes pod里的容器连接到这个地址时,这个连接会被本地的代理转发(称作kube proxy)。该代理运行在来源机器上。转发的目的地是一个相应的后端容器,确切的后端是通过round-robin的策略进行选择,以均衡负载。kube proxy也会追踪后端的pod组的动态变化,如当pod被位于新机器上的新的pod取代的时候,因而服务的IP和DNS名字不用改变。

每一个Kubernetes中的资源,如pod,都通过一个URI来被识别,并且有一个UID。URI中一个总要的组件是,对象的类型(如:pod),对象的名字,和对象的namespace(命名空间)。对于一个特定的对象类型,每一个名字在其命名空间都是独一无二的。在一个对象的名字没有带着命名空间的形式给出,那就是默认的命名空间。UID在时间和空间的范围都是唯一的。